//
//  BasicInfoTool.swift
//  QNN
//
//  Created by zhenyu on 17/3/28.
//  Copyright © 2017年 qianshengqian. All rights reserved.
//

import Foundation
import AddressBook
import AddressBookUI
import AdSupport
import SystemConfiguration.CaptiveNetwork
import CoreTelephony.CTCarrier
import CoreTelephony.CTTelephonyNetworkInfo
import SystemConfiguration
import FCUUID

struct BasicTool {
  
  static var networkStatus = ""
  
  //设备唯一码
  static func getUUID() -> String{
    return UIDevice.current.uuid()
  }
  
  //获取app版本号
  static func getAppVersion() -> String{
    return "v\(Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String)"
  }
  
  //获取操作系统
  static func getOS() -> String{
    return "iOS"
  }
  
  //获取操作系统版本
  static func getOSVersion() -> String{
    return UIDevice.current.systemVersion as String
  }
  
  //获取手机品牌
  static func getMobileBrand() -> String{
    return "Apple"
  }
  
  //获取手机型号
  static func getMobileVersion() -> String{
    var modelName: String {
      var systemInfo = utsname()
      uname(&systemInfo)
      let machineMirror = Mirror(reflecting: systemInfo.machine)
      let identifier = machineMirror.children.reduce("") { identifier, element in
        guard let value = element.value as? Int8, value != 0 else { return identifier }
        return identifier + String(UnicodeScalar(UInt8(value)))
      }
      
      switch identifier {
      case "iPod5,1":                                 return "iPod Touch 5"
      case "iPod7,1":                                 return "iPod Touch 6"
      case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
      case "iPhone4,1":                               return "iPhone 4s"
      case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
      case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
      case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
      case "iPhone7,2":                               return "iPhone 6"
      case "iPhone7,1":                               return "iPhone 6 Plus"
      case "iPhone8,1":                               return "iPhone 6s"
      case "iPhone8,2":                               return "iPhone 6s Plus"
      case "iPhone8,4":                               return "iPhone SE"
      case "iPhone9,1":                               return "iPhone 7"
      case "iPhone9,2":                               return "iPhone 7 Plus"
      case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
      case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
      case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
      case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
      case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
      case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
      case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
      case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
      case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
      case "iPad6,7", "iPad6,8":                      return "iPad Pro"
      case "AppleTV5,3":                              return "Apple TV"
      case "i386", "x86_64":                          return "Simulator"
      default:                                        return identifier
      }
    }
    return modelName
  }
  
  //总内存大小
//  static func getTotalMemorySize() -> String{
//    return MyJSData.fileSizeToString()
//  }
  
  //获取IMSI
  static func getIMSI() -> String{
    let info: CTTelephonyNetworkInfo = CTTelephonyNetworkInfo()
    if info.subscriberCellularProvider == nil{
      return ""
    }
    let carrier: CTCarrier = info.subscriberCellularProvider!
    let mcc = carrier.mobileCountryCode
    let mnc = carrier.mobileNetworkCode
    if mcc == nil || mnc == nil {
      return ""
    }
    return mcc! + mnc!
  }
  
  //获取手机运营商
  static func getMobileProvider() -> String{
    let info: CTTelephonyNetworkInfo = CTTelephonyNetworkInfo()
    if info.subscriberCellularProvider == nil{
      return "other"
    }
    let carrier: CTCarrier = info.subscriberCellularProvider!
    let mobileProvider = carrier.carrierName as String! ?? ""
    switch mobileProvider {
    case "中国移动":
      return "mobile"
    case "中国电信":
      return "telecom"
    case "中国联通":
      return "unicom"
    default:
      return "other"
    }
  }
  
  //获取网络状况
  static func getNetwork() -> String{
    return getNetworkStatus()
  }
  
  //获取MAC地址
  static func getMACAddress() -> String{
    if let cfa:NSArray = CNCopySupportedInterfaces() {
      return self.getWifiInfo(array: cfa, keys: "BSSID")
    }
    return ""
  }
  
  //获取wifi名字
  static func getWIFIName() -> String{
    if let cfa:NSArray = CNCopySupportedInterfaces() {
      return self.getWifiInfo(array: cfa, keys: "SSID")
    }
    return ""
  }
  
  /* 获取WiFi数据 */
  static func getWifiInfo(array:NSArray,keys key:String) -> String {
    for x in array {
      if let dict = CFBridgingRetain(CNCopyCurrentNetworkInfo(x as! CFString)) {
        let ssid = dict[key]! as? String ?? ""
        return ssid
      }
    }
    return ""
  }
  
  //提前获取网络环境
  static func getNetworkStatus() -> String{
    let reachability = Reachability(hostName: "www.apple.com")
    if let reachability = reachability {
      let status = Reachability.currentReachabilityStatus(reachability)
      switch status() {
      case NotReachable:
        networkStatus = "无网络"
        break
      case ReachableViaWiFi:
        networkStatus = "wifi"
        break
      case ReachableViaWWAN:
        networkStatus = "蜂窝网络"
        break
      default:
        break
      }
    }
    return networkStatus
  }
}
